<?php

namespace App\Jobs\Import;

use App\Models\Common\CatData\Video\Vcat;
use App\Models\Common\EntityData\Channel\Sp;
use App\Models\Common\EntityData\Video\Actor;
use App\Models\Common\EntityData\Video\Director;
use App\Models\Common\Enumdata\Enumop\Video\Varea;
use App\Models\Common\Enumdata\Enumop\Video\Vlang;
use App\Models\Common\Enumdata\Enumop\Video\Vyear;
use App\Models\Common\Enumdata\File\Video\Vfileext;
use App\Models\Common\Enumdata\Video\Resolution;
use App\Models\Common\TagData\Video\Vcattag;
use App\Models\Entity\Asset\Video\Media\Vifile;
use App\Models\Entity\Asset\Video\Media\Vposteri;
use App\Models\Entity\Asset\Video\Vasseti;
use App\Models\Entity\Asset\Video\Vseriali;
use DB;
use Excel;
use FTP;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class changeTableImportDataJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * 任务最大尝试次数
     *
     * @var int
     */
    public $tries = 3;

    /**
     * 任务运行的超时时间。
     *
     * @var int
     */
    public $timeout = 3600;

    protected $path;
    protected $batchImportVassetiHistory;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($path, $batchImportVassetiHistory)
    {
        $this->path                      = $path;
        $this->batchImportVassetiHistory = $batchImportVassetiHistory;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $history = [];

        /**
         * 错误的行
         */
        // 编号
        $errorRow['no_empty']  = []; // 编号非空
        $errorRow['no_unique'] = []; // 编号唯一
        // 分集编号
        $errorRow['diversity_no_empty']  = []; // 分集编号为空
        $errorRow['diversity_no_unique'] = []; // 分集编号唯一
        // 分集名称
        $errorRow['diversity_name_empty'] = []; // 分集名称为空
        // 分集的集数
        $errorRow['episode_empty'] = []; // 分集的集数为空

        // 服务商
        $errorRow['sp_empty'] = []; // 服务商为空
        // 剧集名称
        $errorRow['name_empty'] = []; // 剧集名称为空
        // 产地/地区(媒资)
        $errorRow['area_empty'] = []; // 产地为空
        // 分类
        $errorRow['cat_empty'] = []; // 分类为空, 爱情/喜剧
        // 归类
        $errorRow['class_empty'] = []; // 归类不能为空, 电视剧/电影
        // 语种
        $errorRow['language_empty'] = []; // 语种不能为空
        // 时长
        $errorRow['duration_empty'] = []; // 时长不能为空
        // 导演
        $errorRow['director_empty'] = []; // 导演不能为空
        // 导演地区
        $errorRow['director_area_empty'] = []; // 导演地区不能为空
        // 导演和导演地区的项数不一致
        $errorRow['director_not_equal_director_area'] = []; // 导演和导演地区的项数不一致
        // 主演
        $errorRow['actor_empty'] = []; // 演员不能为空
        // 简介
        $errorRow['short_desc_empty'] = []; // 简介不能为空
        // 评分
        $errorRow['score_empty']  = []; // 评分不能为空
        $errorRow['score_bounds'] = []; // 评分不能超过10分
        // 上映时间
        $errorRow['release_time_empty']    = []; // 上映时间不能为空
        $errorRow['release_time_validate'] = []; // 上映时间日期格式不合法
        // 年代
        $errorRow['year_empty'] = []; // 年代不能为空
        // 视频
        $errorRow['video_path_empty']     = []; // 视频路径为空
        $errorRow['video_dir_not_exist']  = []; // ftp上视频目录不存在
        $errorRow['video_file_not_exist'] = []; // ftp上视频文件不存在
        // 图片不存在
        $errorRow['photo_path_empty']     = []; // 图片路径为空
        $errorRow['photo_dir_not_exist']  = []; // ftp上图片目录不存在
        $errorRow['photo_file_not_exist'] = []; // ftp上图片文件不存在
        $errorRow['photo_file_tag_error'] = []; // ftp上图片类型错误
        $errorRow['photo_file_tpl_error'] = []; // ftp上图片规格错误
        // 分集的剧集不存在
        $errorRow['vasseti_not_exist'] = []; // 分集的剧集不存在

        // 总行数
        $rowsCount = 0;
        // 剧集成功的行数
        $successCount = 0;
        // 分集成功的条数
        $diversityCount = 0;
        // 导入开始时间
        $starttime = microtime(true);
        // 开始使用内存
        $startMemory = memory_get_usage();
        // selectSheetsByIndex(0)->
        // 选中第一个Sheet, 这样第一行当做属性名
        Excel::load($this->path, function ($reader) use (&$errorRow, &$diversityCount, &$successCount, &$rowsCount, &$history) {
            // ftp连接, ftp文件目录【需要做成配置项】
            $basePath     = config('custom.base.ftp_director');
            $downloadPath = config('custom.base.download_path');
            $replaceDir   = config('custom.base.replace_dir');
            // 存放视频的ftp
            $ftp = FTP::connection();
            // 存放图片的ftp
            $imageFtp = FTP::connection('connection2');

            // 1.方式1, 这种方法是从文件的第一行数据开始读，一直读取到最后。每行的数据在转化的数组里的下标都是按照先后顺序从零开始的。
            $reader = $reader->getSheet(0);
            //获取表中的数据
            $data = $reader->toArray();
            // 2.方式2, 这种方法从文件第二行开始读取
            // $data = $reader->get()->toArray();
            // $data = $reader->noHeading()->all()->toArray();// 获取到文件的表头信息
            // $data = $reader->ignoreEmpty()->all()->toArray();// 忽略空单元格
            // 获得所有数据
            // $data = $reader->all()->toArray();

            // 字段映射关系
            $fieldsMapping = [
                // 编号
                'no'             => 0,
                // 分集编号
                'diversity_no'   => 1,
                // 服务商
                'sp_id'          => 2,
                // 剧集名称
                'name'           => 3,
                // 分集名称
                'diversity_name' => 4,
                // 集数
                'episodes'       => 5,
                // 第几季
                'season'         => 6,
                // 产地/地区
                'areas'          => 7,
                // 分类
                'cats'           => 8,
                // 归类, 电影/电视剧
                'class'          => 9,
                // 语言
                'languages'      => 10,
                // 时长
                'duration'       => 11,
                // 导演
                'directors'      => 12,
                // 导演地区
                'director_areas' => 13,
                // 演员
                'actors'         => 14,
                // 简介
                'short_desc'     => 15,
                // 详情
                'desc'           => 16,
                // 评分
                'score'          => 17,
                // 图片地址
                'photos'         => 18,
                // 视频地址
                'videos'         => 19,
                // 上映时间
                'release_time'   => 20,
                // 年代
                'years'          => 21,
            ];

            // 总记录数
            $num = count($data);
            // 从哪行开始是数据
            $startRow = 1;
            // 总记录数
            $rowsCount = $num;
            // 第几行开始算【给用户提醒的行号】
            $rowNo = 1;
            // 批次自动生成
            $batch = date('YmdHis');

            for ($i = $startRow; $i < $num; $i++) {
                // 完成数+1
                $this->batchImportVassetiHistory->increment('done_count');

                // 每次插入开启事务
                DB::beginTransaction();
                try {

                    // 判断该条记录有没有问题
                    $flag = true;
                    // 判断是否为分集
                    $diversityFlag = false;
                    // 编号
                    $no = '';
                    // 分集编号
                    $diversity_no = '';
                    // 服务商
                    $sp_id = [];
                    // 剧集名称
                    $name = '';
                    // 分集名称
                    $diversity_name = '';
                    // 集数
                    $episodes = 0;
                    // 第几季
                    $season = '';
                    // 产地/地区(媒资地区)
                    $areas = [];
                    // 分类
                    $cats = [];
                    // 归类, 电影/电视剧
                    $class = '';
                    // 语言
                    $languages = [];
                    // 时长
                    $duration = '';
                    // 导演
                    $directors = [];
                    // 导演地区
                    $director_areas = [];
                    // 演员
                    $actors = [];
                    // 简介
                    $short_desc = '';
                    // 详情
                    $desc = '';
                    // 评分
                    $score = '';
                    // 图片文件目录
                    $photo_path = '';
                    $photos     = [];
                    // 视频文件目录
                    $video_path = '';
                    $videos     = [];
                    // 上映时间
                    $release_time = '';
                    // 年代
                    $years = '';

                    // 分集编号
                    if (isset($data[$i][$fieldsMapping['diversity_no']])) {
                        $diversity_no = trim($data[$i][$fieldsMapping['diversity_no']]);
                    }
                    if (!empty($diversity_no)) {
                        $diversityFlag = true;
                        // $flag                          = false;
                        // $errorRow['diversity_no_empty'][] = ($i + $rowNo);
                    }
                    // 分集编号唯一
                    if ($diversityFlag && Vseriali::where('vseriali_no', $diversity_no)->first()) {
                        $flag                              = false;
                        $errorRow['diversity_no_unique'][] = ($i + $rowNo);
                    }

                    // 编号不能为空
                    if (isset($data[$i][$fieldsMapping['no']])) {
                        $no = trim($data[$i][$fieldsMapping['no']]);
                    }
                    if (empty($no)) {
                        $flag                   = false;
                        $errorRow['no_empty'][] = ($i + $rowNo);
                    }

                    // 编号唯一【排除它是分集】
                    if (!$diversityFlag && Vasseti::where('vasseti_no', $no)->first()) {
                        $flag                    = false;
                        $errorRow['no_unique'][] = ($i + $rowNo);
                    }

                    // 服务商
                    if (isset($data[$i][$fieldsMapping['sp_id']])) {
                        $sp_id = trim($data[$i][$fieldsMapping['sp_id']]);
                    }
                    if (empty($sp_id)) {
                        $flag                   = false;
                        $errorRow['sp_empty'][] = ($i + $rowNo);
                    } else {
                        // 需要将服务商转成id
                        if ($sp1 = Sp::where('name', $sp_id)->first()) {
                            $sp_id = $sp1->id;
                        } else {
                            $sp             = new Sp;
                            $sp->name       = $sp_id;
                            $sp->short_desc = $sp_id;
                            $sp->save();
                            $sp_id = $sp->id;
                        }
                    }

                    // 分集名称
                    if (isset($data[$i][$fieldsMapping['diversity_name']])) {
                        $diversity_name = trim($data[$i][$fieldsMapping['diversity_name']]);
                    }
                    if ($diversityFlag && empty($diversity_name)) {
                        $flag                               = false;
                        $errorRow['diversity_name_empty'][] = ($i + $rowNo);
                    }

                    // 集数
                    if (isset($data[$i][$fieldsMapping['episodes']])) {
                        $episodes = trim($data[$i][$fieldsMapping['episodes']]);
                    }
                    if ($diversityFlag && empty($episodes)) {
                        $flag                        = false;
                        $errorRow['episode_empty'][] = ($i + $rowNo);
                    }

                    // 第几季
                    if (isset($data[$i][$fieldsMapping['season']])) {
                        $season = trim($data[$i][$fieldsMapping['season']]);
                    }

                    // 简介
                    $short_desc = '';
                    if (isset($data[$i][$fieldsMapping['short_desc']])) {
                        $short_desc = trim($data[$i][$fieldsMapping['short_desc']]);
                    }
                    if (empty($short_desc)) {
                        $flag                           = false;
                        $errorRow['short_desc_empty'][] = ($i + $rowNo);
                    }

                    // 详情
                    $desc = '';
                    if (isset($data[$i][$fieldsMapping['desc']])) {
                        $desc = trim($data[$i][$fieldsMapping['desc']]);
                    }

                    // 时长, 默认给60, 时长是给文件的
                    $duration = 60;
                    if (isset($data[$i][$fieldsMapping['duration']])) {
                        $duration = trim($data[$i][$fieldsMapping['duration']]);
                    }
                    if (empty($duration)) {
                        $flag                         = false;
                        $errorRow['duration_empty'][] = ($i + $rowNo);
                    }

                    // 评分, 默认给10
                    $score = 10;
                    if (isset($data[$i][$fieldsMapping['score']])) {
                        $score = trim($data[$i][$fieldsMapping['score']]);
                    }
                    if (empty($score)) {
                        $flag                      = false;
                        $errorRow['score_empty'][] = ($i + $rowNo);
                    }
                    // if ((int)$score > 10) {
                    //     $flag                      = false;
                    //     $errorRow['score_bounds'][] = ($i + $rowNo);
                    // }

                    // 上映时间
                    $release_time = '';
                    if (isset($data[$i][$fieldsMapping['release_time']])) {
                        $release_time = trim($data[$i][$fieldsMapping['release_time']]);
                        // $release_time = date('Y-m-d H:i:s', strtotime($release_time));
                    }
                    if (empty($release_time)) {
                        $flag                             = false;
                        $errorRow['release_time_empty'][] = ($i + $rowNo);
                    } else {
                        if (!checkDateIsValid($release_time)) {
                            $flag                                = false;
                            $errorRow['release_time_validate'][] = ($i + $rowNo);
                        }
                    }

                    // 图片地址
                    $photos = [];
                    if (isset($data[$i][$fieldsMapping['photos']])) {
                        $photo_path = trim($data[$i][$fieldsMapping['photos']]);
                        $photo_path = iconv('utf-8', 'gbk', $photo_path);
                    }
                    if (empty($photo_path)) {
                        // $flag                           = false;
                        // $errorRow['photo_path_empty'][] = ($i + $rowNo);
                    } else {
                        // 文件从存放的图片的ftp
                        $files = $imageFtp->getDirListing($basePath . '/' . $photo_path);
                        if ($files && $flag) {
                            $separator = '/';
                            $photos    = [];
                            foreach ($files as $fileValue) {
                                $file = iconv('gbk', 'utf-8', $fileValue);
                                // 判断是否为图片
                                if (preg_match('/.*?\.(jpg|jpeg|png|gif)$/', $file)) {
                                    $imgFileInfo = [];
                                    // 文件名
                                    $name = '';
                                    // 图片类型, 1 => 海报, 2 => 剧照
                                    $imgtag = '';
                                    // 图片规格, 1 => BIMG, 2 => MIMG, 3 => SIMG, 4 => TB
                                    $imgtpl = '';
                                    // 图片路径
                                    $filePath     = $file;
                                    $fullFileName = substr(strrchr($file, "/"), 1);
                                    $aFileNames   = explode('@', $fullFileName);
                                    $name         = substr($fullFileName, 0, strrpos($name, "@"));
                                    // 排序字段
                                    $listorder = 0;
                                    // 文件名称
                                    $name = $fullFileName;
                                    if (strpos($name, ".") !== false) {
                                        $name = substr($name, 0, strrpos($name, "."));
                                    }
                                    if (strpos($name, "@") !== false) {
                                        $name = substr($name, 0, strpos($name, "@"));
                                    }
                                    // 正则区分是海报/剧照 和 图片规格
                                    if (preg_match('/.*?@(TB|tb)(\\d*)\.(jpg|jpeg|png|gif)$/', $fullFileName)) {
                                        $imgtag = 1;
                                        $imgtpl = 4;
                                        // /php/i, 使用了i 修正符, 不区分大小写去文本中匹配
                                        // preg_match() 第一次匹配成功后就会停止匹配，如果要实现全部结果的匹配preg_match_all()
                                        // .是任意字符
                                        // .?的意思是尽可能少的匹配
                                        // .*具有贪婪的性质，首先匹配到不能匹配为止，根据后面的正则表达式，会进行回溯。
                                        // .*?则相反，一个匹配以后，就往下进行，所以不会进行回溯，具有最小匹配的性质。

                                        // tian modify 2017/08/22
                                        if (preg_match('/.*?@(TB|tb)(\\d+)\.(jpg|jpeg|png|gif)$/', $fullFileName)) {
                                            $listorder = substr($fullFileName, strrpos($fullFileName, "@") + 1);
                                            $listorder = substr($listorder, 0, strrpos($listorder, "."));
                                            $listorder = substr($listorder, 2);
                                        }
                                    } else if (preg_match('/.*?@(BIMG|bimg)\.(jpg|jpeg|png|gif)$/', $fullFileName)) {
                                        $imgtag = 2;
                                        $imgtpl = 1;
                                    } else if (preg_match('/.*?@(MIMG|mimg)\.(jpg|jpeg|png|gif)$/', $fullFileName)) {
                                        $imgtag = 2;
                                        $imgtpl = 2;
                                    } else if (preg_match('/.*?@(SIMG|simg)\.(jpg|jpeg|png|gif)$/', $fullFileName)) {
                                        $imgtag = 2;
                                        $imgtpl = 3;
                                    }

                                    if (empty($imgtag)) {
                                        $errorRow['photo_file_tag_error'][] = ($i + $rowNo);
                                        // dd("图片类型不存在", $i);
                                    }
                                    if (empty($imgtpl)) {
                                        $errorRow['photo_file_tpl_error'][] = ($i + $rowNo);
                                        // dd("图片规格不存在");
                                    }
                                    if (!empty($imgtag) && !empty($imgtpl)) {
                                        // 新建图片
                                        $vposteri           = new Vposteri;
                                        $vposteri->name     = $name;
                                        $vposteri->title    = $name;
                                        $vposteri->subtitle = $name;
                                        // $filePath = strstr($filePath, $replaceDir);
                                        $filePath             = str_replace($replaceDir, "", $filePath);
                                        $vposteri->href       = $filePath;
                                        $vposteri->vimgtag_id = $imgtag;
                                        $vposteri->imgtpl_id  = $imgtpl;
                                        $vposteri->listorder  = $listorder;
                                        if ($vposteri->save()) {
                                            $photos[] = $vposteri->id;
                                        }
                                    }

                                }
                            }
                            if (empty($photos)) {
                                // 没有图片文件
                                $flag                               = false;
                                $errorRow['photo_file_not_exist'][] = ($i + $rowNo);
                            }
                        } else {
                            // 图片文件目录不存在
                            $flag                              = false;
                            $errorRow['photo_dir_not_exist'][] = ($i + $rowNo);
                        }
                    }
                    // 视频地址
                    if (isset($data[$i][$fieldsMapping['videos']])) {
                        $video_path = trim($data[$i][$fieldsMapping['videos']]);
                        $video_path = iconv('utf-8', 'gbk', $video_path);
                    }
                    if (empty($video_path)) {
                        // $flag                           = false;
                        // $errorRow['video_path_empty'][] = ($i + $rowNo);
                    } else {
                        $files = $ftp->getDirListing($basePath . '/' . $video_path);
                        if ($files && $flag) {
                            $separator = '/';
                            $videos    = [];
                            foreach ($files as $fileValue) {
                                $file = iconv('gbk', 'utf-8', $fileValue);
                                // 判断是否为视频文件
                                if (preg_match('/.*?\.(ts|mp4|mpg|mpeg|m3u8)$/', $file)) {
                                    // 扩展名
                                    $fileExt = '';
                                    // 文件路径
                                    $filePath = '';
                                    // 清晰度, $resolution = end($aPaths); 给默认值: 1
                                    $resolution = 1;
                                    // 文件名
                                    $name = '';
                                    // 文件大小
                                    $size = 0;
                                    // 文件类型, 1=>正片, 2 => 片花
                                    $fileType = 1;
                                    // 排序
                                    $listorder = 0;
                                    // 将文件路径以 `/` 分割
                                    // $aPaths = explode('/', $file);
                                    // $fileExt = pathinfo($file, PATHINFO_EXTENSION);
                                    // 扩展名
                                    $fileExt = substr($file, strrpos($file, '.') + 1);
                                    // 文件路径
                                    // $filePath = $basePath . $separator . $file;
                                    $filePath     = $file;
                                    $fullFileName = substr(strrchr($file, '/'), 1);
                                    // 文件大小
                                    $size = round(($ftp->size($fileValue)) / 1024 / 1024, 2);
                                    // 文件名称
                                    $name = $fullFileName;
                                    $aliasName = $name;
                                    if (strpos($file, "@") !== false) {
                                        $name = substr($file, strpos($file, "@") + 1);
                                        // 文件别名
                                        $aliasName  = str_replace('_', '', $name);
                                        $aFileNames = explode('@', $fullFileName);
                                        if (count($aFileNames) > 1) {
                                            // 清晰度
                                            $resolution = $aFileNames[0];
                                        }
                                    }
                                    if (strpos($name, ".") !== false) {
                                        $name = substr($name, 0, strrpos($name, "."));
                                    }
                                    // 是否片花, 不区分大小写
                                    if (stripos($name, "_TP") !== false) {
                                        $name     = substr($name, 0, stripos($name, "_TP"));
                                        $fileType = 2;

                                        // tian modify 2017/08/22
                                        if (preg_match('/.*?_(TP|tp)(\\d+)\.(ts|mp4|mpg|mpeg|m3u8)$/', $fullFileName)) {
                                            $listorder = substr($fullFileName, strrpos($fullFileName, "_TP") + 1);
                                            $listorder = substr($listorder, 0, strrpos($listorder, "."));
                                            $listorder = substr($listorder, 2);
                                        }
                                    }
                                    // 将清晰度转为id
                                    // $aResolutions = ['SD' => 1, 'HD' => 2, 'UD' => 3, 'UHD' => 4, 'FOURK' => 5];
                                    // $resolution = $aResolutions[strtoupper($resolution)];
                                    if ($resolution1 = Resolution::where('name', strtoupper($resolution))->first()) {
                                        $resolution = $resolution1->id;
                                    } else {

                                    }
                                    // 将文件扩展名转为id
                                    // aFileExts = ['mp4' => 1, 'ts' => 2, 'mpg' => 3, 'mpeg' => 4, 'm3u8' => 5];
                                    // $vfileext = $aFileExts[strtolower($fileExt)];
                                    if ($vfileext1 = Vfileext::where('name', strtolower($fileExt))->first()) {
                                        $vfileext = $vfileext1->id;
                                    } else {

                                    }
                                    // 原文件路径
                                    $originalPath = $file;
                                    // 去掉特殊符号后的文件路径
                                    $file   = $basePath . '/' . $video_path . '/' . $aliasName;
                                    // 新建文件
                                    $vifile                = new Vifile;
                                    $vifile->sp_id         = $sp_id;
                                    $vifile->resolution_id = $resolution;
                                    $vifile->vfileext_id   = $vfileext;
                                    $vifile->title         = $name;
                                    $vifile->subtitle      = $name;
                                    $vifile->name          = $name;
                                    // $real_file_path = strstr($file, $replaceDir);
                                    $real_file_path = str_replace($replaceDir, "", $file);
                                    $vifile->path   = $real_file_path;
                                    $vifile->size   = $size;
                                    // $vifile->md5 = '';
                                    $vifile->duration   = $duration;
                                    $vifile->href       = $downloadPath . $real_file_path;
                                    $vifile->short_desc = $name;
                                    $vifile->long_desc  = $name;
                                    $vifile->type       = $fileType;
                                    $vifile->alias_name = $aliasName;
                                    $vifile->listorder  = $listorder;
                                    if ($vifile->save()) {
                                        $videos[] = $vifile->id;
                                        // 修改ftp上的视频文件名称(重庆注入时候视频文件名不能带特殊符号)
                                        $rename = $ftp->rename($originalPath, $file);
                                    }
                                }
                            }
                            if (empty($videos)) {
                                // 没有视频文件
                                $flag                               = false;
                                $errorRow['video_file_not_exist'][] = ($i + $rowNo);
                            }
                        } else {
                            // 视频文件目录不存在
                            $flag                              = false;
                            $errorRow['video_dir_not_exist'][] = ($i + $rowNo);
                        }
                    }

                    /**
                     * 剧集才有的字段
                     */
                    if (!$diversityFlag) {
                        // 剧集名称
                        if (isset($data[$i][$fieldsMapping['name']])) {
                            $name = trim($data[$i][$fieldsMapping['name']]);
                        }
                        if (empty($name)) {
                            $flag                     = false;
                            $errorRow['name_empty'][] = ($i + $rowNo);
                        }

                        // 产地/地区(媒资地区)
                        if (isset($data[$i][$fieldsMapping['areas']])) {
                            $areas = trim($data[$i][$fieldsMapping['areas']]);
                        }
                        if (empty($areas)) {
                            $flag                     = false;
                            $errorRow['area_empty'][] = ($i + $rowNo);
                        } else {
                            // 对产地进行处理, 按照 `&` 裁剪
                            $aAreas = explode('&', $areas);
                            $areas  = [];
                            foreach ($aAreas as $key => $value) {
                                if ($varea1 = Varea::where('name', $value)->first()) {
                                    $areas[] = $varea1->id;
                                } else {
                                    $varea             = new Varea;
                                    $varea->name       = $value;
                                    $varea->short_desc = $value;
                                    $varea->save();
                                    $areas[] = $varea->id;
                                }
                            }
                        }

                        // 归类, 电影/电视剧
                        $class = '';
                        if (isset($data[$i][$fieldsMapping['class']])) {
                            $class = trim($data[$i][$fieldsMapping['class']]);
                        }
                        if (empty($class)) {
                            $flag                      = false;
                            $errorRow['class_empty'][] = ($i + $rowNo);
                        } else {
                            // 需要将归类转成id
                            if ($vcat1 = Vcat::where('name', $class)->first()) {
                                $class = $vcat1->id;
                            } else {
                                $vcat             = new Vcat;
                                $vcat->name       = $class;
                                $vcat->short_desc = $class;
                                $vcat->save();
                                $class = $vcat->id;
                            }
                        }

                        // 分类
                        if (isset($data[$i][$fieldsMapping['cats']])) {
                            $cats = trim($data[$i][$fieldsMapping['cats']]);
                        }
                        if (empty($cats)) {
                            $flag                    = false;
                            $errorRow['cat_empty'][] = ($i + $rowNo);
                        } else {
                            // 对分类进行处理, 按照 `&` 裁剪
                            $aCats        = explode('&', $cats);
                            $cats         = [];
                            $vcattagsData = [];
                            foreach ($aCats as $key => $value) {
                                if ($cat1 = Vcattag::where(['name' => $value, 'vcat_id' => $class])->first()) {
                                    $cats[] = $cat1->id;
                                } else {
                                    $cat          = new Vcattag;
                                    $cat->name    = $value;
                                    $cat->vcat_id = $class;
                                    $cat->save();
                                    $cats[] = $cat->id;
                                    // 插入接口库中的vcattags表
                                    $vcattagsData['vcattag_id'] = $cat->id;
                                    $vcattagsData['name']       = $value;
                                    $vcattagsData['title']      = $value;
                                    $vcattagsData['subtitle']   = $value;
                                    DB::connection('interface')->table('vcattags')->insert($vcattagsData);
                                }
                            }
                        }
                        // 语言/语种
                        $languages = [];
                        if (isset($data[$i][$fieldsMapping['languages']])) {
                            $languages = trim($data[$i][$fieldsMapping['languages']]);
                        }
                        if (empty($languages)) {
                            $flag                         = false;
                            $errorRow['language_empty'][] = ($i + $rowNo);
                        } else {
                            // 对语种进行处理, 按照 `&` 裁剪
                            $aLanguages = explode('&', $languages);
                            $languages  = [];
                            foreach ($aLanguages as $key => $value) {
                                if ($language1 = Vlang::where('name', $value)->first()) {
                                    $languages[] = $language1->id;
                                } else {
                                    $language             = new Vlang;
                                    $language->name       = $value;
                                    $language->short_desc = $value;
                                    $language->save();
                                    $languages[] = $language->id;
                                }
                            }
                        }

                        // 年代
                        // $years = [];
                        // if (isset($data[$i][$fieldsMapping['years']])) {
                        //     $years = trim($data[$i][$fieldsMapping['years']]);
                        // }
                        // if (empty($years)) {
                        //     $flag                     = false;
                        //     $errorRow['year_empty'][] = ($i + $rowNo);
                        // } else {
                        //     // 对年代进行处理, 按照 `&` 裁剪
                        //     $aYears = explode('&', $years);
                        //     $years  = [];
                        //     foreach ($aYears as $key => $value) {
                        //         if ($year1 = Vyear::where('name', $value)->first()) {
                        //             $years[] = $year1->id;
                        //         } else {
                        //             $year             = new Vyear;
                        //             $year->name       = $value;
                        //             $year->short_desc = $value;
                        //             $year->save();
                        //             $years[] = $year->id;
                        //         }
                        //     }
                        // }

                        // 年代
                        $years = [];
                        if (isset($data[$i][$fieldsMapping['years']])) {
                            $years = trim($data[$i][$fieldsMapping['years']]);
                        }
                        if (!empty($years)) {
                            // 对年代进行处理, 按照 `&` 裁剪
                            $aYears = explode('&', $years);
                            $years  = [];
                            foreach ($aYears as $key => $value) {
                                if ($year1 = Vyear::where('name', $value)->first()) {
                                    $years[] = $year1->id;
                                } else {
                                    $year             = new Vyear;
                                    $year->name       = $value;
                                    $year->short_desc = $value;
                                    $year->save();
                                    $years[] = $year->id;
                                }
                            }
                        }

                        // 导演
                        $directors = '';
                        $aDirectors = [];
                        if (isset($data[$i][$fieldsMapping['directors']])) {
                            $directors = trim($data[$i][$fieldsMapping['directors']]);
                        }
                        if (empty($directors)) {
                            $flag                         = false;
                            $errorRow['director_empty'][] = ($i + $rowNo);
                        } else {
                            // 按照 `&` 裁剪
                            $aDirectors = explode('&', $directors);
                        }

                        // // 导演地区
                        // $director_areas = '';
                        // if (isset($data[$i][$fieldsMapping['director_areas']])) {
                        //     $director_areas = trim($data[$i][$fieldsMapping['director_areas']]);
                        // }
                        // if (empty($director_areas)) {
                        //     $flag                              = false;
                        //     $errorRow['director_area_empty'][] = ($i + $rowNo);
                        // } else {
                        //     // 按照 `&` 裁剪
                        //     $aDirectorAreas = explode('&', $director_areas);
                        //     if ($flag) {
                        //         if (count($aDirectors) == count($aDirectorAreas)) {
                        //             $directors = [];
                        //             foreach ($aDirectors as $key => $value) {
                        //                 // 需要将导演转为id【通过导演名+导演地区】
                        //                 if ($director1 = Director::where(['name' => $value, 'area' => $aDirectorAreas[$key]])->first()) {
                        //                     $directors[] = $director1->id;
                        //                 } else {
                        //                     $director             = new Director;
                        //                     $director->name       = $value;
                        //                     $director->short_desc = $value;
                        //                     $director->area       = $aDirectorAreas[$key];
                        //                     // 出生日期
                        //                     $director->save();
                        //                     $directors[] = $director->id;
                        //                 }
                        //             }
                        //         } else {
                        //             $flag = false;
                        //             // 导演和导演的地区不相等的话
                        //             $errorRow['director_not_equal_director_area'][] = ($i + $rowNo);
                        //         }
                        //     }
                        // }

                        // 导演地区
                        $director_areas = '';
                        if (isset($data[$i][$fieldsMapping['director_areas']])) {
                            $director_areas = trim($data[$i][$fieldsMapping['director_areas']]);
                        }
                        if (empty($director_areas)) {
                            foreach ($aDirectors as $key => $value) {
                                // 需要将导演转为id【通过导演名+导演地区】
                                $directors = [];
                                if ($director1 = Director::where(['name' => $value])->first()) {
                                    $directors[] = $director1->id;
                                } else {
                                    $director             = new Director;
                                    $director->name       = $value;
                                    $director->short_desc = $value;
                                    // $director->area       = $aDirectorAreas[$key];
                                    // 出生日期
                                    $director->save();
                                    $directors[] = $director->id;
                                }
                            }
                        } else {
                            // 按照 `&` 裁剪
                            $aDirectorAreas = explode('&', $director_areas);
                            if ($flag) {
                                if (count($aDirectors) == count($aDirectorAreas)) {
                                    $directors = [];
                                    foreach ($aDirectors as $key => $value) {
                                        // 需要将导演转为id【通过导演名+导演地区】
                                        if ($director1 = Director::where(['name' => $value, 'area' => $aDirectorAreas[$key]])->first()) {
                                            $directors[] = $director1->id;
                                        } else {
                                            $director             = new Director;
                                            $director->name       = $value;
                                            $director->short_desc = $value;
                                            $director->area       = $aDirectorAreas[$key];
                                            // 出生日期
                                            $director->save();
                                            $directors[] = $director->id;
                                        }
                                    }
                                } else {
                                    $flag = false;
                                    // 导演和导演的地区不相等的话
                                    $errorRow['director_not_equal_director_area'][] = ($i + $rowNo);
                                }
                            }
                        }

                        // 演员
                        $actors = '';
                        if (isset($data[$i][$fieldsMapping['actors']])) {
                            $actors = trim($data[$i][$fieldsMapping['actors']]);
                        }
                        if (empty($actors)) {
                            $flag                      = false;
                            $errorRow['actor_empty'][] = ($i + $rowNo);
                        } else {
                            // 按照 `&` 裁剪
                            $aActors = explode('&', $actors);
                            $actors  = [];
                            foreach ($aActors as $key => $value) {
                                // 需要将演员转为id
                                if ($actor1 = Actor::where('name', $value)->first()) {
                                    $actors[] = $actor1->id;
                                } else {
                                    $actor             = new Actor;
                                    $actor->name       = $value;
                                    $actor->short_desc = $value;
                                    // 出生日期
                                    $actor->save();
                                    $actors[] = $actor->id;
                                }
                            }
                        }
                        // 保存总集信息
                        if ($flag) {
                            $asset = new Vasseti;
                            // 编号
                            $asset->vasseti_no = $no;
                            // 剧集名称
                            $asset->name = $name;
                            // 集数
                            $asset->episode = $episodes;
                            // 季
                            $asset->season = $season;
                            // 简介
                            $asset->short_desc = $short_desc;
                            // 详情
                            $asset->long_desc = $desc;
                            // 评分
                            $asset->score = $score;
                            // 归类
                            $asset->vcat_id = $class;
                            // 上映时间
                            $asset->firstdate = $release_time;
                            // 收费类型
                            $asset->charge_type = 1;

                            // 标题和副标题都当处理
                            $asset->title    = $name;
                            $asset->subtitle = $name;

                            // 剧集类型
                            if ($diversityFlag) {
                                $asset->vasseti_type = 1;
                            } else {
                                $asset->vasseti_type = 0;
                            }

                            // 还要判断是分集还是总集
                            if ($asset->save()) {
                                // 服务商
                                if (!empty($sp_id)) {
                                    $asset->sps()->sync([$sp_id]);
                                }
                                // 导演
                                if (!empty($directors)) {
                                    $asset->directors()->sync($directors);
                                }
                                // 演员
                                if (!empty($actors)) {
                                    $asset->actors()->sync($actors);
                                }
                                // 图片
                                if (!empty($photos)) {
                                    $asset->vposteris()->sync($photos);
                                }
                                // 文件
                                if (!empty($videos)) {
                                    $asset->vifiles()->sync($videos);
                                }
                                // 年代
                                if (!empty($years)) {
                                    $asset->vyears()->sync($years);
                                }
                                // 地区
                                if (!empty($areas)) {
                                    $asset->vareas()->sync($areas);
                                }
                                // 语种
                                if (!empty($languages)) {
                                    $asset->vlangs()->sync($languages);
                                }
                                // 分类
                                if (!empty($cats)) {
                                    $asset->vcattags()->sync($cats);
                                }
                            }
                            // 成功的行数
                            $successCount++;
                        }
                    }

                    // 保存分集数据
                    if ($diversityFlag && $flag) {
                        // 通过编号找到总集数据
                        $vasseti1 = Vasseti::where('vasseti_no', $no)->first();
                        if ($vasseti1) {
                            $vseriali = new Vseriali;
                            // 剧集id
                            $vseriali->vasseti_id = $vasseti1->id;
                            // 分集编号
                            $vseriali->vseriali_no = $diversity_no;
                            // 分集名称
                            $vseriali->name = $diversity_name;
                            // 集数
                            $vseriali->episode = $episodes;
                            // 简介
                            $vseriali->short_desc = $short_desc;
                            // 详情
                            $vseriali->long_desc = $desc;
                            // 评分
                            $vseriali->score = $score;
                            // 上映时间
                            $vseriali->firstdate = $release_time;
                            // 文件
                            if ($vseriali->save()) {
                                // 视频文件
                                if (!empty($videos)) {
                                    $vseriali->vifiles()->sync($videos);
                                }
                                // 图片
                                if (!empty($photos)) {
                                    $vseriali->vposteris()->sync($photos);
                                }
                            }

                            $diversityCount++;
                        } else {
                            // 分集的剧集不存在
                            $flag                            = false;
                            $errorRow['vasseti_not_exist'][] = ($i + $rowNo);
                        }
                    }

                    if ($flag) {
                        DB::commit();
                    } else {
                        DB::rollback();
                    }
                    // DB::commit();
                } catch (\Exception $e) {
                    DB::rollback(); //事务回滚
                    echo $e->getMessage();
                    dd($e->getCode());
                }
            }
            //组合记录导入日志数据
            $history['batch'] = $batch;
            $history['count'] = $num - 1;
        });

        // 错误数据的行号
        $allErrorRows = [];
        $allErrorRows = array_unique(array_merge(
            // 编号
            $errorRow['no_empty'],
            $errorRow['no_unique'],
            // 服务商
            $errorRow['sp_empty'],
            // 剧集名称
            $errorRow['name_empty'],
            // 产地
            $errorRow['area_empty'],
            // 分类
            $errorRow['cat_empty'],
            // 归类
            $errorRow['class_empty'],
            // 语言/语种
            $errorRow['language_empty'],
            // 时长
            $errorRow['duration_empty'],
            // 导演
            $errorRow['director_empty'],
            // 导演地区
            $errorRow['director_area_empty'],
            $errorRow['director_not_equal_director_area'],
            // 主演
            $errorRow['actor_empty'],
            // 简介
            $errorRow['short_desc_empty'],
            // 评分
            $errorRow['score_empty'],
            // 上映时间
            $errorRow['release_time_empty'],
            $errorRow['release_time_validate'],
            // 年代
            $errorRow['year_empty'],
            // 视频
            $errorRow['video_path_empty'], // excel视频路径为空
            $errorRow['video_dir_not_exist'], // ftp上视频目录不存在
            $errorRow['video_file_not_exist'], // ftp上视频文件不存在
            // 图片
            $errorRow['photo_path_empty'], // 图片路径为空
            $errorRow['photo_dir_not_exist'], // ftp上图片目录不存在
            $errorRow['photo_file_not_exist'], // ftp上图片文件不存在
            $errorRow['photo_file_tag_error'], // ftp上图片文件类型错误
            $errorRow['photo_file_tpl_error'], // ftp上图片文件规格错误

            /**
             * 分集
             */
            // 分集编号不唯一
            $errorRow['diversity_no_unique'],
            // 分集名称
            $errorRow['diversity_name_empty'],
            // 分集集数
            $errorRow['episode_empty'],
            // 分集的剧集不存在
            $errorRow['vasseti_not_exist']
        ));
        $errorCount = count($allErrorRows);
        // $history['error_count'] = $errorCount;
        // $history['file_url']    = $file_url;
        // $history['user_id']     = $user_id;
        // $history['success_count'] = $successCount;
        // 导入结束时间
        $endtime        = microtime(true);
        $consuming_time = round($endtime - $starttime, 4);
        $endMemory      = memory_get_usage();
        $usedMemory     = ($endMemory - $startMemory) / 1024;

        // $history['consuming_time'] = $consuming_time;
        // 写批量导入媒资的日志表
        // BatchImportUserHistory::create($history);

        $flag    = true;
        $message = '<div style="word-wrap: break-word;">';
        $message .= '耗时:';
        $message .= $consuming_time . '秒<br />';
        $message .= '耗费内存:';
        $message .= "{$usedMemory} K<br />";

        $message .= '数据总数:';
        $message .= $history['count'] . '行<br />';
        $message .= '剧集成功的行数:';
        $message .= $successCount . '行<br />';
        $message .= '分集成功的行数:';
        $message .= $diversityCount . '行<br />';
        $message .= '错误的总行数:';
        $message .= $errorCount . '行<br />';

        // 编号
        if (count($errorRow['no_empty']) > 0) {
            $flag = false;
            $message .= '编号为空[no_empty]的行号:' . implode(',', $errorRow['no_empty']) . '<br />';
        }
        // 编号不唯一
        if (count($errorRow['no_unique']) > 0) {
            $flag = false;
            $message .= '编号不唯一[no_unique]的行号:' . implode(',', $errorRow['no_unique']) . '<br />';
        }
        // 服务商
        if (count($errorRow['sp_empty']) > 0) {
            $flag = false;
            $message .= '服务商为空[sp_empty]的行号:' . implode(',', $errorRow['sp_empty']) . '<br />';
        }
        // 剧集名称
        if (count($errorRow['name_empty']) > 0) {
            $flag = false;
            $message .= '剧集名称为[name_empty]空的行号:' . implode(',', $errorRow['name_empty']) . '<br />';
        }
        // 产地
        if (count($errorRow['area_empty']) > 0) {
            $flag = false;
            $message .= '产地为空[area_empty]的行号:' . implode(',', $errorRow['area_empty']) . '<br />';
        }
        // 分类
        if (count($errorRow['cat_empty']) > 0) {
            $flag = false;
            $message .= '分类为空[cat_empty]的行号:' . implode(',', $errorRow['cat_empty']) . '<br />';
        }
        // 归类
        if (count($errorRow['class_empty']) > 0) {
            $flag = false;
            $message .= '归类为空[class_empty]的行号:' . implode(',', $errorRow['class_empty']) . '<br />';
        }
        // 语言/语种
        if (count($errorRow['language_empty']) > 0) {
            $flag = false;
            $message .= '语言为空[language_empty]的行号:' . implode(',', $errorRow['language_empty']) . '<br />';
        }
        // 年代
        // if (count($errorRow['year_empty']) > 0) {
        //     $flag = false;
        //     $message .= '年代为空[year_empty]的行号:' . implode(',', $errorRow['year_empty']) . '<br />';
        // }

        // 时长
        if (count($errorRow['duration_empty']) > 0) {
            $flag = false;
            $message .= '时长为空[duration_empty]的行号:' . implode(',', $errorRow['duration_empty']) . '<br />';
        }
        // 导演
        if (count($errorRow['director_empty']) > 0) {
            $flag = false;
            $message .= '导演为空[director_empty]的行号:' . implode(',', $errorRow['director_empty']) . '<br />';
        }
        // 导演地区
        // if (count($errorRow['director_area_empty']) > 0) {
        //     $flag = false;
        //     $message .= '导演地区为空[director_area_empty]的行号:' . implode(',', $errorRow['director_area_empty']) . '<br />';
        // }
        // 导演和导演的地区不一致
        if (count($errorRow['director_not_equal_director_area']) > 0) {
            $flag = false;
            $message .= '导演和导演的地区不一致[director_not_equal_director_area]的行号:' . implode(',', $errorRow['director_not_equal_director_area']) . '<br />';
        }
        // 主演
        if (count($errorRow['actor_empty']) > 0) {
            $flag = false;
            $message .= '主演为空[actor_empty]的行号:' . implode(',', $errorRow['actor_empty']) . '<br />';
        }
        // 简介
        if (count($errorRow['short_desc_empty']) > 0) {
            $flag = false;
            $message .= '简介为空[short_desc_empty]的行号:' . implode(',', $errorRow['short_desc_empty']) . '<br />';
        }
        // 评分
        if (count($errorRow['score_empty']) > 0) {
            $flag = false;
            $message .= '评分为空[score_empty]的行号:' . implode(',', $errorRow['score_empty']) . '<br />';
        }
        if (count($errorRow['score_bounds']) > 0) {
            $flag = false;
            $message .= '评分超过10[score_bounds]的行号(评分在0-10分范围内):' . implode(',', $errorRow['score_bounds']) . '<br />';
        }
        // 上映时间
        if (count($errorRow['release_time_empty']) > 0) {
            $flag = false;
            $message .= '上映时间为空[release_time_empty]的行号:' . implode(',', $errorRow['release_time_empty']) . '<br />';
        }
        if (count($errorRow['release_time_validate']) > 0) {
            $flag = false;
            $message .= '上映时间不合法[release_time_validate]的行号(正确格式:2017/8/3或2017-8-3):' . implode(',', $errorRow['release_time_validate']) . '<br />';
        }
        // 视频
        if (count($errorRow['video_path_empty']) > 0) {
            $flag = false;
            $message .= 'excel(视频文件目录)为空[video_path_empty]的行号:' . implode(',', $errorRow['video_path_empty']) . '<br />';
        }
        if (count($errorRow['video_dir_not_exist']) > 0) {
            $flag = false;
            $message .= 'ftp上(视频目录)不存在[video_dir_not_exist]的行号:' . implode(',', $errorRow['video_dir_not_exist']) . '<br />';
        }
        if (count($errorRow['video_file_not_exist']) > 0) {
            $flag = false;
            $message .= 'ftp上(视频文件)不存在[video_file_not_exist]的行号:' . implode(',', $errorRow['video_file_not_exist']) . '<br />';
        }
        // 图片
        if (count($errorRow['photo_path_empty']) > 0) {
            $flag = false;
            $message .= 'excel(图片文件目录)为空[photo_path_empty]的行号:' . implode(',', $errorRow['photo_path_empty']) . '<br />';
        }
        if (count($errorRow['photo_dir_not_exist']) > 0) {
            $flag = false;
            $message .= 'ftp上(图片目录)不存在[photo_dir_not_exist]的行号:' . implode(',', $errorRow['photo_dir_not_exist']) . '<br />';
        }
        if (count($errorRow['photo_file_not_exist']) > 0) {
            $flag = false;
            $message .= 'ftp上(图片文件)不存在[photo_file_not_exist]的行号:' . implode(',', $errorRow['photo_file_not_exist']) . '<br />';
        }
        if (count($errorRow['photo_file_tag_error']) > 0) {
            $flag = false;
            $message .= 'ftp上(图片文件)类型错误[photo_file_tag_error]的行号:' . implode(',', $errorRow['photo_file_tag_error']) . '<br />';
        }
        if (count($errorRow['photo_file_tpl_error']) > 0) {
            $flag = false;
            $message .= 'ftp上(图片文件)规格错误[photo_file_tpl_error]的行号:' . implode(',', $errorRow['photo_file_tpl_error']) . '<br />';
        }
        /**
         * 分集
         */
        // 分集编号唯一
        if (count($errorRow['diversity_no_unique']) > 0) {
            $flag = false;
            $message .= '分集编号不唯一[diversity_no_unique]的行号:' . implode(',', $errorRow['diversity_no_unique']) . '<br />';
        }
        // 分集名称
        if (count($errorRow['diversity_name_empty']) > 0) {
            $flag = false;
            $message .= '分集名称为空[diversity_name_empty]的行号:' . implode(',', $errorRow['diversity_name_empty']) . '<br />';
        }
        // 集数
        if (count($errorRow['episode_empty']) > 0) {
            $flag = false;
            $message .= '集数为空[episode_empty]的行号:' . implode(',', $errorRow['episode_empty']) . '<br />';
        }
        // 分集的剧集不存在
        if (count($errorRow['vasseti_not_exist']) > 0) {
            $flag = false;
            $message .= '分集的剧集不存在[vasseti_not_exist]的行号:' . implode(',', $errorRow['vasseti_not_exist']) . '<br />';
        }
        $message .= '</div>';
        //通过标志位判断前端返回时成功还是失败
        if ($flag) {
            $message = '<div class="alert alert-success">' . $message . '</div>';
        } else {
            $message = '<div class="alert alert-error">' . $message . '</div>';
        }
        $this->batchImportVassetiHistory->diversity_count = $diversityCount;
        $this->batchImportVassetiHistory->success_count   = $successCount;
        $this->batchImportVassetiHistory->error_count     = $errorCount;
        $this->batchImportVassetiHistory->consuming_time  = $consuming_time;
        $this->batchImportVassetiHistory->used_memory     = $usedMemory;
        $this->batchImportVassetiHistory->content         = $message;
        $this->batchImportVassetiHistory->save();
    }
}
